package com.derbysoft.defender.mp.api.requester;

import com.derbysoft.defender.util.JsonUtil;
import com.derbysoft.defender.mp.api.request.CustomAccount;
import com.derbysoft.defender.mp.api.request.Message;
import com.derbysoft.defender.mp.api.response.ApiResponse;
import org.springframework.util.Assert;

/**
 * <p>
 * 当用户和公众号产生特定动作的交互时（具体动作列表请见下方说明），微信将会把消息数据推送给开发者，开发者可以在一段时间内（目前修改为48小时）调用客服接口，通过POST一个JSON数据包来发送消息给普通用户。此接口主要用于客服等有人工消息处理环节的功能，方便开发者为用户提供更加优质的服务。
 * 目前允许的动作列表如下（公众平台会根据运营情况更新该列表，不同动作触发后，允许的客服接口下发消息条数不同，下发条数达到上限后，会遇到错误返回码，具体请见返回码说明页）
 * </p>
 * <pre>
 * 接口的统一参数说明
 * 参数	      是否必须	说明
 * access_token	是	调用接口凭证
 * kf_account	是	完整客服账号，格式为：账号前缀@公众号微信号
 * kf_nick	是	客服昵称
 * kf_id	是	客服工号
 * nickname	是	客服昵称，最长6个汉字或12个英文字符
 * password	否	客服账号登录密码，格式为密码明文的32位加密MD5值。该密码仅用于在公众平台官网的多客服功能中使用，若不使用多客服功能，则不必设置密码
 * media	是	该参数仅在设置客服头像时出现，是form-data中媒体文件标识，有filename、filelength、content-type等信息
 * </pre>
 * Created by Afee Lee on 2017-03-21 08:49
 *
 * @author Afee Lee
 * @version 1.0
 * @see Object
 * @since 1.8
 */
public class CustomServiceRequester extends AbstractRequester {
    private static final String URL_SEND_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}";

    private static final String URL_LIST_CUSTOM_ACCOUNT = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token={access_token}";
    private static final String URL_ADD_CUSTOM_ACCOUNT = "https://api.weixin.qq.com/customservice/kfaccount/add?access_token={access_token}";
    private static final String URL_UPDATE_CUSTOM_ACCOUNT = "https://api.weixin.qq.com/customservice/kfaccount/update?access_token={access_token}";
    private static final String URL_DEL_CUSTOM_ACCOUNT = "https://api.weixin.qq.com/customservice/kfaccount/del?access_token={access_token}";

    private String accessToken;

    public CustomServiceRequester(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getAccessToken() {
        return accessToken;
    }

    /**
     * 客服接口-发消息<br/>
     * 接口调用请求说明<br/>
     * http请求方式: POST<br/>
     * https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
     */
    public Object sendMessage(Message message) {
        return postForEntity(URL_SEND_MESSAGE, message, String.class, accessToken);
    }

    /**
     * 开发者通过本接口，获取公众号中所设置的客服基本信息，包括客服工号、客服昵称、客服登录账号。<br/>
     * http请求方式: GET<br/>
     * https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=ACCESS_TOKEN
     * <p/>
     * 返回说明（正确时的JSON返回结果）：
     * <pre>
     * {
     * "kf_list": [
     * {
     * "kf_account": "test1@test",
     * "kf_nick": "ntest1",
     * "kf_id": "1001"
     * "kf_headimgurl": " http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjfUS8Ym0GSaLic0FD3vN0V8PILcibEGb2fPfEOmw/0"
     * },
     * {
     * "kf_account": "test2@test",
     * "kf_nick": "ntest2",
     * "kf_id": "1002"
     * "kf_headimgurl": " http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjfUS8Ym0GSaLic0FD3vN0V8PILcibEGb2fPfEOmw /0"
     * },
     * {
     * "kf_account": "test3@test",
     * "kf_nick": "ntest3",
     * "kf_id": "1003"
     * "kf_headimgurl": " http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjfUS8Ym0GSaLic0FD3vN0V8PILcibEGb2fPfEOmw /0"
     * }
     * ]
     * }
     * </pre>
     * 错误时微信会返回错误码等信息，请根据错误码查询错误信息
     */
    public String listCustomAccount() {
        return getForEntity(URL_LIST_CUSTOM_ACCOUNT, String.class, accessToken);
    }

    /**
     * 开发者可以通过本接口为公众号添加客服账号，每个公众号最多添加10个客服账号。该接口调用请求如下：<br/>
     * http请求方式: POST<br/>
     * https://api.weixin.qq.com/customservice/kfaccount/add?access_token=ACCESS_TOKEN
     * <p/>
     * POST数据示例如下：
     * <pre>
     * {
     * "kf_account" : "test1@test",
     * "nickname" : "客服1",
     * "password" : "pswmd5",
     * }
     * </pre>
     * 返回说明（正确时的JSON返回结果）：
     * <pre>
     * {
     * "errcode" : 0,
     * "errmsg" : "ok",
     * }
     * </pre>
     * 错误时微信会返回错误码等信息，请根据错误码查询错误信息
     *
     * @param customAccount account to be added.
     */
    public void addCustomAccount(CustomAccount customAccount) {
        Assert.notNull(customAccount, "customAccount should not be null");
        postForEntity(URL_ADD_CUSTOM_ACCOUNT, JsonUtil.toJson(customAccount), ApiResponse.class, accessToken);
    }

    /**
     * 开发者可以通过本接口为公众号修改客服账号。该接口调用请求如下：<br/>
     * http请求方式: POST<br/>
     * https://api.weixin.qq.com/customservice/kfaccount/update?access_token=ACCESS_TOKEN
     * <p/>
     * POST数据示例如下：
     * <pre>
     * {
     * "kf_account" : "test1@test",
     * "nickname" : "客服1",
     * "password" : "pswmd5",
     * }
     * </pre>
     * 返回说明（正确时的JSON返回结果）：
     * <pre>
     * {
     * "errcode" : 0,
     * "errmsg" : "ok",
     * }
     * </pre>
     * 错误时微信会返回错误码等信息，请根据错误码查询错误信息
     *
     * @param customAccount account to be updated
     */
    public void updateCustomAccount(CustomAccount customAccount) {
        Assert.notNull(customAccount, "customAccount should not be null");
        postForEntity(URL_UPDATE_CUSTOM_ACCOUNT, JsonUtil.toJson(customAccount), ApiResponse.class, accessToken);
    }

    /**
     * 开发者可以通过该接口为公众号删除客服帐号。该接口调用请求如下：<br/>
     * http请求方式: GET<br/>
     * https://api.weixin.qq.com/customservice/kfaccount/del?access_token=ACCESS_TOKEN
     * <p/>
     * POST数据示例如下：
     * <pre>
     * {
     * "kf_account" : "test1@test",
     * "nickname" : "客服1",
     * "password" : "pswmd5",
     * }
     * </pre>
     * 返回说明（正确时的JSON返回结果）：
     * <pre>
     * {
     * "errcode" : 0,
     * "errmsg" : "ok",
     * }
     * </pre>
     * 错误时微信会返回错误码等信息，请根据错误码查询错误信息
     *
     * @param customAccount account to be deleted
     */
    public void deleteCustomAccount(CustomAccount customAccount) {
        Assert.notNull(customAccount, "customAccount should not be null");
        postForEntity(URL_DEL_CUSTOM_ACCOUNT, JsonUtil.toJson(customAccount), ApiResponse.class, accessToken);
    }
}
